iT邦幫忙

2021 iThome 鐵人賽

DAY 22
3
自我挑戰組

【Side Project】 系列 第 22

【Side Project】 訂單清單 - 資料庫新增狀態欄位

  • 分享至 

  • xImage
  •  

昨天取得資料庫中的清單後,會發現一個問題,
我們無法判斷哪些訂單已經完成和未完成。

狀態欄位新增

  1. 開啟ssms
  2. 連線到webmenu的資料庫中
  3. 新增orderDone 與 itemDone 兩個欄位
begin tran
ALTER TABLE menulisth ADD orderDone bit Default 0
ALTER TABLE menulistb ADD itemDone bit Default 0

commit tran

https://ithelp.ithome.com.tw/upload/images/20211005/20115941224xjnn4Fo.jpg
兩個數值初始值都給予0,當資料型態變成 1的時候就是已經完成了。

修改Data Class

接著我們需要把剛剛新增的欄位加入到我們的Data Class 中,
這樣才可以與資料庫的欄位完全匹配

  1. 打開Menulisth.cs
  2. 新增欄位 OrderDone
[SugarColumn(IsOnlyIgnoreInsert = true)]
        public bool OrderDone { get; set; }

我們在新增的時候已經有賦予預設值了,所以在insert的時候不需要給他數值。
另外SQL中的bit 等同於 C#中的 bool
所以我們這邊要用bool型態對應。
3. 打開Menulistb.cs
4. 新增欄位 ItemDone

[SugarColumn(IsOnlyIgnoreInsert = true)]
        public bool ItemDone { get; set; }

跟前面一樣使用bool型態作對應。

取得未完成的訂單

若我們在SelectOrder()中想取得的訂單只有未完成訂單的話,
我們只需要在SelectOrder中修改

  1. 打開ProprietorModel.cs
  2. 修改SelectOrder(),新增where條件
var list_h = db.Queryable<Menulisth>().Where(item => item.OrderDone == false).OrderBy(menu => menu.Createtime, OrderByType.Asc).ToList();
                var list_b = db.Queryable<Menulistb, Menulisth>((body, head) => new JoinQueryInfos(JoinType.Left, head.Uid == body.H_uid))
                    .Where((body, head) => head.OrderDone == false)
                    .OrderBy((body, head) => head.Createtime, OrderByType.Asc)
                    .Select<Menulistb>().ToList();

完整程式碼:

public List<Order> SelectOrder(IConfiguration config)
        {
            var order_list = new List<Order>();
            //連線設定
            SqlSugarClient db = new SqlSugarClient(new ConnectionConfig()
            {
                //連線字串
                ConnectionString = config.GetValue<string>("WebmenuConnectionString"),
                DbType = DbType.SqlServer,//連線類型
                IsAutoCloseConnection = true //自動關閉連線
            });
            
            
            try
            {

                //當執行時,觸發事件
                db.Aop.OnLogExecuting = (sql, pars) =>
                {
                    Console.WriteLine(sql);//查看SQL語法
                };
                //begin tran
                db.BeginTran();
                //取得菜單表頭,並排序(正序)
                var list_h = db.Queryable<Menulisth>().Where(item => item.OrderDone == false).OrderBy(menu => menu.Createtime, OrderByType.Asc).ToList();
                var list_b = db.Queryable<Menulistb, Menulisth>((body, head) => new JoinQueryInfos(JoinType.Left, head.Uid == body.H_uid))
                    .Where((body, head) => head.OrderDone == false)
                    .OrderBy((body, head) => head.Createtime, OrderByType.Asc)
                    .Select<Menulistb>().ToList();
                //將表頭加入到表身資料寫入
                foreach (var head in list_h)
                {
                    
                    var order = new Order();
                    //加入表頭
                    order.head = head;
                    //加入表身
                    foreach(var body in list_b)
                    {
                        if(body.H_uid == head.Uid)
                        {
                            order.bodys.Add(body);
                        }
                    }
                    order_list.Add(order);

                }

                db.CommitTran();
            }
            catch
            {
                db.RollbackTran();//rollback
                throw;
            }
            return order_list;
        }
  1. 這樣就可以取得未完成訂單的清單
    https://ithelp.ithome.com.tw/upload/images/20211005/20115941Etg5DpNpKN.jpg

結語

從今天的修改可以看出對一些資料進行修改時,是完全不需要動到Controller
當有一天我們程式碼成長到上千行之後,我們不需要在茫茫大海裡找出我們處理資料的邏輯。
只需要在對應的function()中進行修改即可。

之後的篇章中我們會用到今天新增的欄位來幫我們分已完成與未完成的訂單。
這邊會需要用到動態新增資料的方式。
如果希望資料庫能有更完整的結構的話還可以新增兩個欄位:

  1. 資料修改的時間
  2. 資料取得的時間
    透過這兩個資料的比對,可以讓我們知道說每次應該要取多少筆資料。
    而不用每次做更新時,都需要把所有未完成/已完成的資料再取回來一次。

上一篇
【Side Project】 訂單清單 - 取得訂單資訊
下一篇
【Side Project】 訂單清單 - 未完成清單(後台資料傳前台&動態生成html)
系列文
【Side Project】 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言